home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / machine / rainbow.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  3KB  |  165 lines

  1. /*************************************************************************
  2.  
  3.   Rainbow Island C-Chip Protection
  4.  
  5. *************************************************************************/
  6.  
  7. #include "driver.h"
  8.  
  9. /*************************************
  10.  *
  11.  *        Interrupt handler
  12.  *
  13.  *************************************/
  14.  
  15. int rainbow_interrupt(void)
  16. {
  17.     return 4;  /* Interrupt vector 4 */
  18. }
  19.  
  20. /*************************************
  21.  *
  22.  * Rainbow C-Chip, Protection
  23.  *
  24.  *************************************/
  25.  
  26. static int FrameBank,
  27.            ChipOffset=0;
  28.  
  29. /*************************************
  30.  *
  31.  * Writes to C-Chip - Important Bits
  32.  *
  33.  *************************************/
  34.  
  35. WRITE_HANDLER( rainbow_c_chip_w )
  36. {
  37.   switch(offset+1)
  38.   {
  39.       case 0x001: if ((data & 0xff) == 1)    ChipOffset = 0x4950;
  40.                    break;
  41.  
  42.     case 0x01b: ChipOffset = 0;
  43.                    break;
  44.  
  45.     case 0xc01: FrameBank = (data & 0xff) << 1;
  46.                 break;
  47.   }
  48. }
  49.  
  50. /*************************************
  51.  *
  52.  * Reads from C-Chip
  53.  *
  54.  *************************************/
  55.  
  56. extern int mrh_bank1(int address);
  57.  
  58. READ_HANDLER( rainbow_c_chip_r )
  59. {
  60.   unsigned char *CROM = memory_region(REGION_USER1);    /* C-Chip Dump */
  61.  
  62.   int Address;
  63.   int Data1,Data2;
  64.   int ans;
  65.  
  66.   /* Start with standard return from rom image */
  67.  
  68.   Address = ChipOffset
  69.           + FrameBank
  70.           + ((READ_WORD(cpu_bankbase[1] + 0x1048) & 0xFF) << 4);
  71.  
  72.   Data2   = (CROM[Address] << 8) + CROM[Address+1];
  73.   Data1   = ((CROM[Address+2] << 8) + CROM[Address+3]) - Data2;
  74.  
  75.   if (Data1 == 0)
  76.   {
  77.       ans = 0;
  78.   }
  79.   else
  80.   {
  81.       if (Data1 <= (offset >> 1))
  82.     {
  83.         ans = 0;
  84.     }
  85.     else
  86.     {
  87.       ans = CROM[(offset >> 1) + Data2];
  88.     }
  89.   }
  90.  
  91.   /* Overrides for specific locations */
  92.  
  93.   switch(offset+1)
  94.   {
  95.                 /* Input Ports */
  96.  
  97.       case 0x007: if (FrameBank==0) ans=input_port_2_r(offset);
  98.                 break;
  99.  
  100.     case 0x009: if (FrameBank==0) ans=input_port_3_r(offset);
  101.                 break;
  102.  
  103.     case 0x00b: if (FrameBank==0) ans=input_port_4_r(offset);
  104.                 break;
  105.  
  106.     case 0x00d: if (FrameBank==0) ans=input_port_5_r(offset);
  107.                 break;
  108.  
  109.  
  110.                 /* Program expects the following results */
  111.  
  112.     case 0x001: ans=0xff;                    /* Won't draw screen until */
  113.                 break;                        /*   this is set to 0xff   */
  114.                                             /*    Countdown Timer ?    */
  115.  
  116.       case 0x201: ans=0xff;                    /* Level Data Ready */
  117.                 break;
  118.  
  119.     case 0x803: ans=0x01;                    /* C-Chip Check ? */
  120.                 break;
  121.  
  122.  
  123.                 /* These are taken from a lookup table */
  124.                 /* in the bootleg, and not from C-Chip */
  125.  
  126.     case 0x295: ans=0;                        /* G Below */
  127.                 break;
  128.  
  129.     case 0x297: ans=0;                        /* G Right */
  130.                 break;
  131.  
  132.     case 0x299: ans=0x10;                    /* O below */
  133.                 break;
  134.  
  135.     case 0x29b: ans=0x10;                    /* O Right */
  136.                 break;
  137.  
  138.     case 0x29d: ans=0x20;                    /* A Below */
  139.                 break;
  140.  
  141.     case 0x29f: ans=0x20;                    /* A Right */
  142.                 break;
  143.  
  144.     case 0x2a1: ans=0x30;                    /* L Below */
  145.                 break;
  146.  
  147.     case 0x2a3: ans=0x38;                    /* L Right */
  148.                 break;
  149.  
  150.     case 0x2a5: ans=0x40;                    /* I Below */
  151.                 break;
  152.  
  153.     case 0x2a7: ans=0x50;                    /* I Right */
  154.                 break;
  155.  
  156.     case 0x2a9: ans=0x50;                    /* N Below */
  157.                 break;
  158.  
  159.     case 0x2ab: ans=0x60;                    /* N Right */
  160.                 break;
  161.   }
  162.  
  163.   return ans;
  164. }
  165.